import { Options } from '../entity/Options';

export class Logger {
  private static instance: Logger;
  private options: Options;

  public static log = () => {
    if (!Logger.instance) {
      Logger.instance = new Logger();
    }
    return Logger.instance;
  };

  public error(message: any) {
    console.log(`${colors.fgRed}[ERROR]${colors.reset}${getCurrentDateTime()}: ${message}`);
  }

  public info(message: any) {
    if (this.options.logLevel !== 'info' && this.options.logLevel !== 'debug') return;
    console.log(`${colors.fgGreen}[INFO]${colors.reset}${getCurrentDateTime()}: ${message}`);
  }

  public debug(message: any) {
    if (this.options.logLevel !== 'debug') return;
    console.log(`${colors.fgYellow}[DEBUG]${colors.reset}${getCurrentDateTime()}: ${message}`);
  }

  public init(options: Options) {
    this.options = options;
  }
}

function getCurrentDateTime() {
  const now = new Date();

  const year = now.getFullYear();
  const month = (now.getMonth() + 1).toString().padStart(2, '0');
  const day = now.getDate().toString().padStart(2, '0');

  const hours = now.getHours().toString().padStart(2, '0');
  const minutes = now.getMinutes().toString().padStart(2, '0');
  const seconds = now.getSeconds().toString().padStart(2, '0');
  const milliseconds = now.getMilliseconds().toString().padStart(3, '0');

  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}:${milliseconds}`;
}

// 定义颜色代码
export const colors = {
  reset: '\x1b[0m',
  bright: '\x1b[1m',
  dim: '\x1b[2m',
  underscore: '\x1b[4m',
  blink: '\x1b[5m',
  reverse: '\x1b[7m',
  hidden: '\x1b[8m',
  fgBlack: '\x1b[30m',
  fgRed: '\x1b[31m',
  fgGreen: '\x1b[32m',
  fgYellow: '\x1b[33m',
  fgBlue: '\x1b[34m',
  fgMagenta: '\x1b[35m',
  fgCyan: '\x1b[36m',
  fgWhite: '\x1b[37m',
  bgBlack: '\x1b[40m',
  bgRed: '\x1b[41m',
  bgGreen: '\x1b[42m',
  bgYellow: '\x1b[43m',
  bgBlue: '\x1b[44m',
  bgMagenta: '\x1b[45m',
  bgCyan: '\x1b[46m',
  bgWhite: '\x1b[47m',
};
export const log = Logger.log();
